package main

import (
	"fmt"
	"sync"
)

//go内置的map不是并发安全的，在多个协程并发对map进行操作时，会出现资源竞争问题导致出错
//sync.Map提供了一个高效并发安全的map，且不需要make
//
//sync.Map对数据的存储和取出方法也不是以索引方式，而是Store()和 Load()两个方法
//遍历页提供了Range方法

func main() {
	var sMap sync.Map
	var subMap sync.Map

	//存储键值对
	sMap.Store("name", "小明")
	sMap.Store("age", 20)
	subMap.Store("sub", "go")
	sMap.Store("list", &subMap)

	//fmt.Println(sMap)

	//取值
	val, _ := sMap.Load("name")
	fmt.Println("name is", val)

	//删除键值对
	sMap.Delete("age")
	f := func(key, value interface{}) bool {
		fmt.Println(key, ":", value)
		return true
	}
	sMap.Range(f)
	subMap.Range(f)

	sMap.Range(func(key, value interface{}) bool {
		fmt.Println(key, ":", value)
		if key == "list"{
			subMap.Range(f)
		}
		return true
	})


}
